home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
misc
/
amag
/
12b92.lha
/
Tips & Tricks
/
Dezimalstrings (Assembler)
/
Str2Long.txt
< prev
next >
Wrap
Text File
|
1992-11-02
|
3KB
|
54 lines
Dezimalstring in Longword
Assembler-Programmierer sind bereits bei einfachen Ein- und Ausgaben
von ganzen Zahlen auf sich gestellt: Während Hochsprachen dem
Software-Autor komfortable Routinen wie »printf« oder »scanf« zur
Verfügung stellen, muß sich der Assembler-Freak diese selbst
schreiben.
Für die Ausgabe einer ganzen Zahl sollte die Funktion »RawDoFmt()« der
»exec.library« verwendet werden. Eine ähnliche Routine für Umwandlung
eines Strings in ein Longword existiert in der Library allerdings
nicht. Soll nun eine Dezimalzahl in ein Longword übersetzt werden,
nutzen viele Autoren folgenden Algorithmus:
Beginnend mit der letzten
Ziffer werden diese sukzessive mit dem jeweiligen Stellenwert
(1, 10, 100,...) multipliziert und anschließend die Produkte addiert.
Nachteilig an diesem Verfahren ist, daß man vorab die gesamte
Zeichenkette lesen und dann anschließend auf die zuvor übersprungenen
Zeichen zugreifen muß.
Dieses Handikap weist der im Listing ».asm« verwandte Algorithmus
nicht auf. Zunächst liest er die erste Ziffer und betrachtet deren
Wert als vorläufiges Ergebnis. Nun werden die folgenden Zeichen
behandelt, bis man auf eine ungültige Ziffer trifft. Bei jeder Stelle
wird das bisherige Ergebnis mit der Basis 10 multipliziert und der
Wert der Ziffer addiert. Beim String »234« würde das Verfahren z.B.
das vorläufige Ergebnis 2 mit 10 malnehmen und 3 dazuzählen,
um abschließend 23 mit 10 zu multiplizieren und 4 addieren. Das
Endergebnis lautet so 234.
Dieses Verfahren ist nicht nur auf das Dezimalsystem beschränkt,
sondern gilt für alle anderen Stellenwertsysteme (z.B. Dual-, Oktal-,
Hexadezimalsystem). Das vorläufige Ergebnis wird allgemein mit der
Basis multipliziert. Für diese arithmetische Operation scheidet
allerdings die MULU-Anweisung des 68000er-Prozessors aus, da der
Befehl zwei 16-Bit-Words multipliziert, wenngleich hier das vorläufige
Ergebnis überhalb dieser Grenze liegen kann. Deshalb muß man einen
alternativen Weg eingeschlagen, wobei aber das Abfangen eines
Überlaufs (engl. overflow) auf keinen Fall unterbleiben darf. Bei
Zweierpotenzen als Basis kann sukzessive der ADD-Befehl zum Verdoppeln
des Wertes verwendet werden (die LSL-Anweisung wäre langsamer). Möchte
man einen Faktor mit der Basis 10 multiplizieren, spaltet man die
Operation auf:
10*Faktor = 2*Faktor + 2^2*2*Faktor
Der Faktor wird
also zuerst verdoppelt und dann in ein Hilfsregister übertragen. Den
Inhalt des Hilfsregisters verschiebt man um zwei Dualstellen, bevor er
schließlich addiert wird.
Roger Fishlin